package modelo.Escenografia;

import java.awt.geom.Area;
import java.util.ArrayList;
import java.util.Iterator;

import modelo.controlAereo.*;
import modelo.Orientacion.AreaRectangular;
import modelo.Orientacion.Posicion;
import modelo.controlAereo.AvionPesado;

public abstract class Pista {
	
	protected ArrayList<Posicion> entradasAPista;
        protected AreaRectangular areaDeEntrada;

        /*	Pre: Debe pasarse una posicion de entrada.
	 * 	Post: Se crea la pista, inicializando la lista de Entradas y agregando la posicion de entrada.
	 */

       	public Pista(Posicion posEntrada){
            areaDeEntrada = new AreaRectangular(3,3);
            entradasAPista = new ArrayList<Posicion>();
            entradasAPista.add(posEntrada);
	}

        /*	Pre: Se debe pasar una posicion de entrada.
	 *	Post: Se agrega la posicion de entrada a la lista.
	 */

	public void agregarEntrada(Posicion unaEntrada){	
		entradasAPista.add(unaEntrada);
	}

        public boolean estaEnLaPista(Movible aeronave){
        /*PreCondicion: la pista debe estar creada
          PostCondicion: devuelve true si la aeronave se encuentra dentro de alguna entrada de la pista, en caso contrario devuelve false*/
            Posicion posA = aeronave.obtenerPosicion();
            Area area = (aeronave.obtenerArea()).getArea(posA);
            Iterator<Posicion> iteradorEntradas = this.entradasAPista.iterator();
		Posicion unaEntrada;
		while (iteradorEntradas.hasNext()){
			unaEntrada = iteradorEntradas.next();
			if (areaDeEntrada.estasSobreEstaArea(unaEntrada, area)){
				return true;
			}
		}
		return false;
        }

        public Posicion devolverUnaDeSusEntradas(){
            /*Se penso para poder crear las trayectorias de los aviones computarizados
              PreCondicion: la pista debe estar creada y debe tener al menos una entrada
              PostCondicion: devuelve la primera entrada que guarda la pista*/
            return entradasAPista.get(0);
        }

        /*	PARA LOS SIGUIENTES METODOS:
	 *	Pre: Se debe pasar un tipo de Aeronave.
	 *	Post: Devuelve false en cualquiera de los casos.
	 * 	ACLARACION: En caso de que una subclase permita Aterrizar a alguna Aeronave,
	 * 				debe redefinir estos método.
	 * 	DOUBLE DISPATCH
	 */

        public boolean tienePermitidoAterrizar(AvionSimple aeronave){
            return false;
        }

        public boolean tienePermitidoAterrizar(AvionComputarizado aeronave){
            return false;
        }

        public boolean tienePermitidoAterrizar(AvionPesado aeronave){
            return false;
        }

        public boolean tienePermitidoAterrizar(Helicoptero aeronave){
            return false;
        }

}
